iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Modern Web

每日挑戰,從Javascript面試題目了解一些你可能忽略的概念系列 第 21

每日挑戰,從Javascript面試題目了解一些你可能忽略的概念 - Day21

  • 分享至 

  • xImage
  •  
tags: ItIron2021 Javascript

前言

昨天我們打開了非同步的大門,今天我們要繼續探討與其有關的題目,忍耐一下! 這個主題會一路延續到Day24,趁這段時間把非同步相關的題目搞清楚吧!

本日題目與解釋

 請你簡單解釋什麼是promise

再忙..也要來張防雷圖

thinking-day21

又是一個讓新手聞風喪膽的東西,不過坦白說多摸幾次就會知道這並不真的這麼可怕,所謂的promise就是一個會在未來某個時間點回傳某個數值的物件,也就是一個非同步的值(async value)。而一個promise只會有以下三種狀態

  1. pending
  2. fulfilled
  3. rejected

進入範例前我們先做個簡單的比喻,你今天打開熊貓人點了一份午餐,熊貓平台收到你的訂單並承諾(promise pending)你10-15分鐘後會收到你的餐點,若一切順利,在15分鐘後你確實收到了餐點(promise fulfilled),但萬一訂單被取消了,你收到的就只有失望(promise rejected)。另外,一旦promise被fullfilled或是rejected,這個promise就功成身退了,有個專有名詞叫settled(after a promise being fulfilled or rejected,the promise is said to be settled)

了解基本概念後,接著你要知道要如何寫出一個基本的prmoise

const p = new Promise((resolve, reject) => {
    if (滿足某些條件) {
       resolve('某個A值');
    } else if (滿足另一些條件) {
       resolve('某個B值')
    } else {
       reject('某個C值')
    }
})

Promoise建構子中你需要傳入一個函數(稱作該promise的excuter),這函數需要傳入兩個參數,一般來說我們會照慣例命名為resolve & reject兩個參數,分別決定fulfilled或rejected時,最終要回傳什麼值。

注意一下,我剛剛的示範中寫了不只一個resolve,很多時候你需要根據不同的情況決定要回傳什麼樣的resolve/reject值,因此一個promise內是可以存在複數個不同的情況的,但注意一旦回傳了值(也就是使用了resolve/reject後),整個promise就結束了(settled),後續的程式碼便不會再執行。

而這個promise在使用時可以藉由原生的**.then方法去取得resolved後的值**、藉由**.catch方法去取得rejected的值**,看一個簡單的例子吧!

const p1 = new Promise((resolve, reject) => {
    resolve('看屁看')
})

const p2 = new Promise((resolve, reject) => {
    reject('邱喔')
})

p1.then(value => {
 console.log(value) //看屁看
})

p2.catch(value => {
 console.log(value) //邱喔
})

以上是很基本的promise說明,一般你在請求API時收到的都是promise物件,你再根據請求成功或失敗決定你要如何運用回傳的值,我知道這篇其實很簡略,但就像我不斷強調的,解釋名詞並不是我的目的,在進入明天的單元之前,強烈建議再透過其他資源去增加你對promise的熟練度!

本日核心觀念與總結

核心觀念

promise

總結

  • 了解什麼是promise
  • 了解一個promise只會有三種狀態
  • 了解一旦狀態改變後,promise的狀態就不會再變更
  • 了解如何寫一個promise
  • 了解如何取用promise的回傳值

本文章同步發布於個人部落格,有興趣的朋友也可以來逛逛~!


上一篇
每日挑戰,從Javascript面試題目了解一些你可能忽略的概念 - Day20
下一篇
每日挑戰,從Javascript面試題目了解一些你可能忽略的概念 - Day22
系列文
每日挑戰,從Javascript面試題目了解一些你可能忽略的概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言